Cómo instalar Traefik con Docker Compose

¿Qué es Traefik?

Traefik es un router que permite publicar servicios en internet de una manera rápida y sencilla. Recibe peticiones y determina qué servicios deben responderlas. Existen otras herramientas parecidas que también actúan cómo proxy inverso tales cómo haproxy.

Además de actuar cómo proxy inverso, también dispone de utilidades que nos harán la vida más sencilla con respecto a la gestión, adquisición y renovación de certificados SSL, ya que lo hace de manera automática. En este ejemplo utilizaremos LetsEncrypt como proveedor de certificados, aunque se pueden utilizar otros.

Una vez instalado el manejo es relativamente sencillo una vez se llega a comprender cómo funciona. Se gestiona mediante etiquetas (labels) en los servicios o contenedores en los que queremos que actúe.

Requisitos Previos

Instalar Traefik

Para instalar Traefik en nuestro sistema, crearemos un contenedor Docker utilizando la herramienta Docker Compose. Para ello lo primero que haremos será crear una estructura de directorios y ficheros de configuración para el servicio, además de un fichero docker-compose.yml con la definición del contenedor, y después lo pondremos en ejecución en el sistema.

mkdir -p docker/traefik/traefik-data
touch docker/traefik/traefik-data/acme.json
chmod 600 docker/traefik/traefik-data/acme.json
nano docker/traefik/traefik-data/traefik.yml

Dentro del fichero traefik.yml incluimos el siguiente contenido. Cambiar la dirección de correo para que LetsEncrypt nos avise acerca de la caducidad de los certificados:

api:
  dashboard: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  http:
    acme:
      email: email@ejemplo.com
      storage: acme.json
      httpChallenge:
        entryPoint: http

Traefik escuchará así en los puertos 80 y 443 correspondientes a los servicios http y https respectivamente. El dashboard de monitorización de Traefik no dispone de método de autentificación, así que crearemos unas credenciales en formato htpasswd para después asigárselas al servicio del dashboard de Traefik. Cambiar el usuario y contraseña por los que deseemos:

sudo apt-get install apache2-utils
echo $(htpasswd -nb  ) | sed -e s/\\$/\\$\\$/g

Ahora procedemos a crear la red virtual dónde estará enganchado Traefik y el contenedor:

docker network create traefik-proxy
cd docker/traefik
nano docker-compose.yml

Dentro del fichero docker-compose.yml incluimos el siguiente contenido. Cambiar el usuario/contraseña por los generados anteriormente, y el host de acceso por el que corresponda:

version: '3'

services:
  traefik:
    image: traefik:v2.4.2
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - traefik-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik-data/traefik.yml:/traefik.yml:ro
      - ./traefik-data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.ejemplo.com`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=USUARIO:CONTRASEÑA"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.ejemplo.com`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=http"
      - "traefik.http.routers.traefik-secure.service=api@internal"

networks:
  traefik-proxy:
    external: true

Guardamos la información pulsando Ctrl+X, y, ENTER.

Ponemos en marcha el contenedor usando Docker Compose:

docker-compose up -d

Abrimos un navegador web, y accedemos al dashboard de Traefik que tenemos en ejecución en Docker:

https://traefik.ejemplo.com/

Entradas relacionadas